home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Deutsche Edition 1
/
Deutsche Edition 1.iso
/
amok
/
011-020
/
amok19
/
area
/
graphdemo.mod
< prev
next >
Wrap
Text File
|
1993-11-04
|
8KB
|
322 lines
(*---------------------------------------------------------------------------
:Program. GraphDemo.mod
:Contents. Demonstriert BackDrop, Area und Pattern auf EHB-Screen
:Author. Bernd Preusing
:Address. Gerhardstr. 16 D-2200 Elmshorn
:Phone. 04121/22486
:Copyright. Public Domain
:Language. Modula-2
:Translator. M2Amiga V3.2e
:History. 0.0 13-May-89 Preusing
:Imports. BackDrop 1.2 Preusing
:Imports. LoPattern 1.0 Preusing
:Imports. Area 1.0 Preusing
:Imports. BeamRandom 1.0 Preusing
:Bugs. nur in der graphics.library
:Remark. Ein saumäßiges Programm, bitte nicht ansehen!
:Remark. Rectangle und Bar sind allgemein brauchbar!
:Usage. Starten und öfter mal die linke Maustaste drücken.
---------------------------------------------------------------------------*)
MODULE GraphDemo;
FROM SYSTEM IMPORT BITSET, CAST, ADR, ADDRESS, INLINE, SHIFT;
FROM Arts IMPORT Assert, CurrentLevel, TermProcedure, BreakPoint;
FROM Heap IMPORT Allocate, AllocMem;
FROM BackDrop IMPORT OpenBackDrop, BdRp;
FROM Graphics IMPORT RastPortPtr, SetAPen, SetBPen, Move, Draw, PolyDraw,
RectFill, DrawEllipse,
Flood, SetDrMd, DrawModes, DrawModeSet,jam2;
FROM Exec IMPORT CopyMem;
FROM Area IMPORT InitArea, AreaMove, AreaDraw, AreaEllipse, AreaCircle,
AreaEnd;
FROM GfxMacros IMPORT SetOPen, SetDrPt, BndryOff;
FROM BeamRandom IMPORT RND;
FROM LoPattern IMPORT Pattern, SetPattern;
CONST DEPTH = 6; (* gibt Extrahalfbrite *)
MAXCOLS = CAST(INTEGER,SHIFT(1,DEPTH));
WIDTH = 340; (* Overscan! *)
HEIGHT = 256;
VAR rp: RastPortPtr;
MaxPatt: INTEGER;
PROCEDURE WaitButton;
VAR ciaa[0BFE001H]:SET OF [0..7];
BEGIN
REPEAT
UNTIL NOT(6 IN ciaa);
REPEAT
UNTIL (6 IN ciaa)
END WaitButton;
PROCEDURE ButtonPressed():BOOLEAN;
VAR ciaa[0BFE001H]:SET OF [0..7];
BEGIN
RETURN NOT(6 IN ciaa)
END ButtonPressed;
PROCEDURE Bar(col,xl,yu,w,h:INTEGER);
VAR xr,yo:INTEGER;
BEGIN
xr:=xl+w-1;
yo:=yu-h+1;
SetAPen(rp,col);
SetOPen(rp,1);
SetBPen(rp,2);
SetDrMd(rp,jam2);
SetPattern(rp,Pattern(0));
RectFill(rp,xl,yo,xr,yu);
SetPattern(rp,half);
AreaMove(rp,xl,yo);
AreaDraw(rp,xl+5,yo-5);
AreaDraw(rp,xr+5,yo-5);
AreaDraw(rp,xr,yo);
AreaMove(rp,xr,yo);
AreaDraw(rp,xr+5,yo-5);
AreaDraw(rp,xr+5,yu-5);
AreaDraw(rp,xr,yu);
AreaEnd(rp);
END Bar;
PROCEDURE AreaTest;
PROCEDURE Min(a,b:INTEGER):INTEGER;
BEGIN
IF a<b THEN RETURN a ELSE RETURN b END
END Min;
VAR rp: RastPortPtr; i: INTEGER;
a1,b1,a2,b2: INTEGER;
BEGIN
rp:=BdRp;
SetDrMd(rp,DrawModeSet{dm0});
SetAPen(rp,1);
SetBPen(rp,6);
SetOPen(rp,5);
AreaEllipse(rp,80,100,60,70);
AreaEnd(rp);
WaitButton;
SetAPen(rp,3);
AreaMove(rp,10,10);
AreaDraw(rp,WIDTH-20,80);
AreaDraw(rp,300,100);
AreaDraw(rp,80,200);
AreaDraw(rp,10,10);
AreaEnd(rp);
WaitButton;
SetAPen(rp,9);
AreaMove(rp,10,50);
AreaDraw(rp,WIDTH-10,50);
AreaDraw(rp,WIDTH/2,200);
AreaMove(rp,WIDTH/2,10);
AreaDraw(rp,WIDTH-10,160);
AreaDraw(rp,10,160);
AreaEnd(rp);
WaitButton;
SetAPen(rp,7);
AreaMove(rp,WIDTH-1,200);
AreaDraw(rp,WIDTH-20,180);
AreaDraw(rp,WIDTH-20,200);
AreaDraw(rp,WIDTH-1,200);
AreaEnd(rp);
WaitButton;
SetAPen(rp,2);
AreaEllipse(rp,90,100,60,70);
AreaEnd(rp);
WaitButton;
SetAPen(rp,4);
AreaEllipse(rp,WIDTH/2,100,100,80);
AreaEnd(rp);
WaitButton;
SetAPen(rp,5); (* = OPen *)
DrawEllipse(rp,WIDTH/2+10,100,100,80);
WaitButton;
SetAPen(rp,1);
IF Flood(rp,0,WIDTH/2+10,100)=0 THEN END;
FOR i:=MIN(INTEGER) TO MAX(INTEGER) DO END;
BndryOff(rp);
WaitButton;
BndryOff(rp);
LOOP
SetAPen(rp,RND(MAXCOLS));
SetBPen(rp,RND(MAXCOLS));
SetOPen(rp,RND(MAXCOLS));
SetPattern(rp,Pattern(RND(MaxPatt+1)));
IF RND(2)=1 THEN
AreaMove(rp,RND(WIDTH-10)+2,RND(HEIGHT-10)+2);
FOR i:=1 TO 10 DO
AreaDraw(rp,RND(WIDTH-10)+2,RND(HEIGHT-10)+2);
END;
AreaEnd(rp)
ELSE
a1:=RND(WIDTH-20)+10; b1:=RND(HEIGHT-20)+10;
a2:=a1+RND(WIDTH-20-a1)+2; b2:=b1+RND(HEIGHT-20-b1)+2;
AreaMove(rp,a1,b1);
AreaDraw(rp,a1,b2);
AreaDraw(rp,a2,b2);
AreaDraw(rp,a1,b1);
(* RectFill(rp,a1,b1,a2,b2); *)
AreaEllipse(rp,a1,b1,RND(Min(a1,WIDTH-a1-4)+2),RND(Min(b1,HEIGHT-b1-4))+2);
AreaEnd(rp);
END;
IF ButtonPressed() THEN EXIT END;
END;
END AreaTest;
PROCEDURE PattTest(rp: RastPortPtr);
VAR x,y,i,xw,yh:INTEGER;
CONST Zeilen = 3;
BEGIN
SetDrPt(rp,0FFFFH);
SetAPen(rp,1); SetOPen(rp,2);
xw:=WIDTH/(MaxPatt/Zeilen+1);
yh:=HEIGHT/Zeilen;
x:=0; y:=0;
FOR i:=0 TO MaxPatt DO
SetPattern(rp,Pattern(i));
RectFill(rp,x,y,x+xw-1,y+yh-1);
INC(x,xw);
IF x>WIDTH-10 THEN x:=0; INC(y,yh) END;
END;
WaitButton;
END PattTest;
PROCEDURE EHBTest(rp: RastPortPtr);
VAR x,y,i,xw,yh:INTEGER;
CONST Zeilen = 4;
BEGIN
SetDrPt(rp,0FFFFH);
SetAPen(rp,1); BndryOff(rp);
xw:=WIDTH/16;
yh:=HEIGHT/Zeilen;
x:=0; y:=0;
SetPattern(rp,Pattern(0));
FOR i:=0 TO 63 DO
SetAPen(rp,i);
RectFill(rp,x,y,x+xw-1,y+yh-1);
INC(x,xw);
IF x>WIDTH-10 THEN x:=0; INC(y,yh) END;
END;
WaitButton;
END EHBTest;
PROCEDURE Rectangle(rp: RastPortPtr; x1,y1,x2,y2:INTEGER);
TYPE iPtr = POINTER TO INTEGER;
VAR i: iPtr;
re: ARRAY[1..4] OF RECORD x,y:INTEGER END;
BEGIN
Move(rp,x1,y1);
i:=ADR(re);
i^:=x2; INC(i,2); i^:=y1; INC(i,2);
i^:=x2; INC(i,2); i^:=y2; INC(i,2);
i^:=x1; INC(i,2); i^:=y2; INC(i,2);
i^:=x1; INC(i,2); i^:=y1;
PolyDraw(rp,4,ADR(re));
END Rectangle;
PROCEDURE HighResRect(rp: RastPortPtr; x1,y1,x2,y2:INTEGER);
TYPE iPtr = POINTER TO INTEGER;
VAR i: iPtr;
re: ARRAY[1..7] OF RECORD x,y:INTEGER END;
BEGIN
Move(rp,x1,y1); (* rechts und links doppelt *)
i:=ADR(re);
i^:=x1; INC(i,2); i^:=y2; INC(i,2);
i^:=x2; INC(i,2); i^:=y2; INC(i,2);
i^:=x2; INC(i,2); i^:=y1; INC(i,2);
i^:=x1+1; INC(i,2); i^:=y1; INC(i,2);
i^:=x1+1; INC(i,2); i^:=y2; INC(i,2);
i^:=x2-1; INC(i,2); i^:=y2; INC(i,2);
i^:=x2-1; INC(i,2); i^:=y1;
PolyDraw(rp,7,ADR(re));
END HighResRect;
PROCEDURE f(rp{1+8}:RastPortPtr;farbe{2}:INTEGER);
VAR i: INTEGER;
BEGIN
FOR i:=10 TO WIDTH-10 BY 2 DO
farbe:=CAST(INTEGER,CAST(BITSET,farbe)/BITSET{1});
SetAPen(rp,farbe);
Move(rp,WIDTH/2,10); Draw(rp,i,100);
Draw(rp,WIDTH/2,180);
END;
SetAPen(rp,3);
Move(rp,10,100); Draw(rp,WIDTH-20,100);
END f;
PROCEDURE CircleTest(rp:RastPortPtr);
VAR i,j,k,l:INTEGER;
BEGIN
FOR i:=1 TO 20 DO
j:=RND(WIDTH-20)+10; k:=RND(HEIGHT-10)+5;
l:=RND(WIDTH-300)+10;
SetAPen(rp,RND(MAXCOLS+1));
DrawEllipse(rp,j,k,l,l);
END;
WaitButton;
END CircleTest;
PROCEDURE BarTest();
VAR i,br,h:INTEGER;
BEGIN
Bar(3,10,HEIGHT-10,200,HEIGHT-20);
Bar(0,210,150,50,100);
WaitButton;
br:=(WIDTH-10)/12;
FOR i:=0 TO 11 DO
h:=RND(HEIGHT-20)+10;
Bar(i+3,i*br+5,HEIGHT-5,br+1,h);
END;
WaitButton;
FOR i:=0 TO 11 DO
h:=RND(HEIGHT-80)+10;
Bar(i+3,200-i*5,(HEIGHT-5-55)+i*5,30,h);
END;
END BarTest;
VAR i: INTEGER;
BEGIN
MaxPatt:=INTEGER(MAX(Pattern));
OpenBackDrop(DEPTH,WIDTH,HEIGHT,ADR('Press left Mouse Button'));
rp:=BdRp;
SetDrPt(rp,0F0F0H);
InitArea(rp,50,AllocMem);
f(rp,1);
WaitButton;
FOR i:=0 TO 200 BY 2 DO
Rectangle(rp,i,i,WIDTH-10,HEIGHT-20);
END;
EHBTest(rp);
CircleTest(rp);
PattTest(rp);
AreaMove(rp,150,100);
AreaDraw(rp,250,160);
AreaDraw(rp,150,160);
AreaDraw(rp,250,100);
AreaCircle(rp,150,100,40);
AreaCircle(rp,150,100,80);
AreaEnd(rp);
WaitButton;
WaitButton;
BarTest;
WaitButton;
AreaTest;
WaitButton;
END GraphDemo.